// 小程序全局配置
App({
  onLaunch() {
    console.log('小程序启动')

    // 检查云开发环境
    if (!wx.cloud) {
      console.error('请使用 2.2.3 或以上的基础库以使用云能力')
    } else {
      try {
        // 使用默认云开发环境
        wx.cloud.init({
          env: wx.cloud.DYNAMIC_CURRENT_ENV, // 动态获取当前环境ID
          traceUser: true,
        })
        console.log('云开发初始化成功')
      } catch (err) {
        console.log('云开发初始化失败:', err)
      }
    }

    // 获取用户信息
    this.getUserInfo()

    // 初始化全局数据
    this.globalData = {
      userInfo: null,
      openid: null,
      shareData: null,
      systemInfo: null, // 不在这里同步获取，避免阻塞启动
      couponList: [],
      cartList: []
    }

    // 异步获取系统信息
    this.loadSystemInfo()
  },

  // 异步获取系统信息
  loadSystemInfo() {
    try {
      const systemInfo = wx.getSystemInfoSync()
      this.globalData.systemInfo = systemInfo
      console.log('系统信息加载完成', systemInfo)
    } catch (err) {
      console.log('获取系统信息失败:', err)
      // 使用默认值
      this.globalData.systemInfo = {
        platform: 'unknow',
        system: 'ios 10.0',
        screenWidth: 375,
        screenHeight: 667,
        windowWidth: 375,
        windowHeight: 667,
        pixelRatio: 2
      }
    }
  },

  // 获取用户信息
  getUserInfo() {
    const that = this

    // 检查用户是否已授权
    wx.getSetting({
      success: res => {
        if (res.authSetting['scope.userInfo']) {
          // 用户已授权，直接获取昵称头像
          wx.getUserProfile({
            desc: '用于完善会员资料',
            success: res => {
              that.globalData.userInfo = res.userInfo
              console.log('获取用户信息成功:', res.userInfo)
              // 尝试获取openid，但不强制
              that.tryGetOpenid()
            },
            fail: err => {
              console.log('获取用户信息失败:', err)
            }
          })
        } else {
          // 未授权，不进行额外操作
          console.log('用户未授权获取个人信息')
          that.tryGetOpenid() // 仍然尝试获取openid
        }
      },
      fail: err => {
        console.log('检查授权状态失败:', err)
        that.tryGetOpenid()
      }
    })
  },

  // 尝试获取openid（不强依赖）
  async tryGetOpenid() {
    try {
      const res = await wx.cloud.callFunction({
        name: 'quickstartFunctions',
        data: {
          type: 'getOpenId'
        }
      })

      if (res.result) {
        this.globalData.openid = res.result.openid
        console.log('获取openid成功:', res.result.openid)

        // 注册用户或更新用户信息（异步执行）
        this.registerOrUpdateUser(res.result)
      }

    } catch (err) {
      console.log('获取openid失败，可能未开通云开发:', err)
      console.log('小程序将以离线模式运行，部分功能可能受限')
      // 继续以离线模式运行，不影响核心功能
    }
  },

  // 注册用户或更新用户信息（异步，不阻塞主流程）
  async registerOrUpdateUser(userData) {
    try {
      if (!userData || !userData.openid) {
        console.log('注册用户信息不完整，跳过注册')
        return
      }

      const db = wx.cloud.database()
      const userCollection = db.collection('users')

      // 检查用户是否已存在
      const userRes = await userCollection.where({
        openid: userData.openid
      }).get()

      const userInfo = this.globalData.userInfo || {}
      const userDataObj = {
        openid: userData.openid,
        appid: userData.appid || '',
        nickName: userInfo.nickName || '匿名用户',
        avatarUrl: userInfo.avatarUrl || '',
        gender: userInfo.gender || 0,
        city: userInfo.city || '',
        province: userInfo.province || '',
        country: userInfo.country || '',
        language: userInfo.language || 'zh_CN',
        createTime: new Date(),
        updateTime: new Date(),
        inviteCode: this.generateInviteCode(),
        inviteCount: 0,
        coupons: [],
        balance: 0,
        points: 0,
        level: 1,
        status: 1
      }

      if (userRes.data.length === 0) {
        // 新用户，创建记录
        await userCollection.add({
          data: userDataObj
        })
        console.log('新用户注册成功')

        // 发放新用户优惠券
        await this.grantNewUserCoupons(userData.openid)
      } else {
        // 老用户，更新信息
        await userCollection.doc(userRes.data[0]._id).update({
          data: {
            nickName: userInfo.nickName || userRes.data[0].nickName,
            avatarUrl: userInfo.avatarUrl || userRes.data[0].avatarUrl,
            updateTime: new Date()
          }
        })
        console.log('用户更新成功')
      }

    } catch (err) {
      console.error('用户注册/更新失败:', err)
      // 非关键错误，不中断主流程
    }
  },

  // 生成邀请码
  generateInviteCode() {
    return Math.random().toString(36).substr(2, 8).toUpperCase()
  },

  // 发放新用户优惠券
  async grantNewUserCoupons(openid) {
    try {
      const db = wx.cloud.database()
      const couponCollection = db.collection('coupons')

      const newUserCoupons = [
        {
          type: '新人专享',
          title: '新用户满50减20券',
          amount: 2000, // 单位：分
          minAmount: 5000, // 最低消费
          userId: openid,
          status: 0, // 0-未使用，1-已使用，2-已过期
          startTime: new Date(),
          endTime: new Date(Date.now() + 30 * 24 * 60 * 60 * 1000), // 30天有效期
          createTime: new Date(),
          description: '限新用户首次使用，满50元减20元',
          categoryLimit: '', // 无品类限制
          productLimit: '' // 无商品限制
        },
        {
          type: '通用券',
          title: '5元通用券',
          amount: 500, // 单位：分
          minAmount: 2000,
          userId: openid,
          status: 0,
          startTime: new Date(),
          endTime: new Date(Date.now() + 7 * 24 * 60 * 60 * 1000), // 7天有效期
          createTime: new Date(),
          description: '满20元可用，限7天用完',
          categoryLimit: '',
          productLimit: ''
        }
      ]

      // 批量创建优惠券
      for (const coupon of newUserCoupons) {
        await couponCollection.add({
          data: coupon
        })
      }

      // 更新用户coupons字段
      await db.collection('users').where({
        openid: openid
      }).update({
        data: {
          coupons: newUserCoupons.map(() => ({ used: false, expired: false })),
          updateTime: new Date()
        }
      })

      console.log('新用户优惠券发放成功')

    } catch (err) {
      console.error('发放优惠券失败:', err)
    }
  },

  // 全局工具函数
  utils: {
    // 显示加载状态
    showLoading(title = '加载中...') {
      wx.showLoading({
        title: title,
        mask: true
      })
    },

    // 隐藏加载状态
    hideLoading() {
      wx.hideLoading()
    },

    // 显示成功提示
    showSuccess(title) {
      wx.showToast({
        title: title,
        icon: 'success',
        duration: 2000
      })
    },

    // 显示错误提示
    showError(title) {
      wx.showToast({
        title: title,
        icon: 'error',
        duration: 2000
      })
    },

    // 显示普通提示
    showInfo(title) {
      wx.showToast({
        title: title,
        icon: 'none',
        duration: 2000
      })
    }
  },

  globalData: {
    userInfo: null,
    openid: null,
    shareData: null,
    systemInfo: null,
    couponList: [],
    cartList: []
  }
})